library(forecast)
해당 자료는 전북대학교 이영미 교수님 2023고급시계열분석 자료임
import
getwd()
options(repr.plot.width = 12, repr.plot.height = 6)
정상시계열
<- rnorm(200) #z~normal(0,1) z
\(\{ z_t, t=1,2,\dots, \}, n=200\)
먼저 시도표를 그리자.
ACF/PACF도 중요해!
- ACF: \(\rho_1 = Corr(Z_t, Z_{t+1}) \rightarrow \hat \rho_1 = \dfrac{\hat \gamma_1}{\hat \gamma_0}\)
\(\hat \gamma_0 = \dfrac{1}{n} \sum_{i=1}^n (Z_t - \bar Z)^2\) : Var임
\(\hat \gamma_1 = \dfrac{1}{n} \sum_{t=1}^{n-1} (Z_t - \bar Z)(Z_{t+1} - \bar Z) \rightarrow(Z_1-\bar Z)(Z_2-\bar Z) \dots (Z_{n-1} - \bar Z)(Z_n - \bar Z)\)
<- c(1,2,3)) (a
- 1
- 2
- 3
::shift(a,2) data.table
- <NA>
- <NA>
- 1
2만큼 이동
cor(z, data.table::shift(z,1))
- data.table에 있는 shift함수: 위에서는 z를 1만큼 shift시키라는 함수
cor(z, data.table::shift(z,1), use = 'pairwise.complete.obs')
- 옵션을 줘야 오류가 안난다. NA를 빼고 cor을 구해주라는 옵션
plot.ts(z, lwd=2)
abline(h=0, lty=2)
- 평균이 0을 중심으로 되어있고, 등분산성으로 보인다.
par(mfrow=c(1,2))
acf(z, ylim=c(-1,1),lag.max=24)
pacf(z, ylim=c(-1,1),lag.max=24)
lag.max=24인것은 주기로 생각해서 24를 많이 하는데 변경 가능하다
ACF: 시차 사이의 corr
PACF: 중간 사이의 효과를 뺀 corr
파란색 점선: 기각역, 그 안에 있으면 통계적으로 유의하지 않다! 다 0이다.
\(\rho_1\)는 시차가 0이니까 자기자신은 항상 0
왼쪽 그림에 2번째 \(\rho\)값은 위에서 구한 0.0806503414196885 값이고, 이는 오른쪽 그림에서 첫번째 선값과 동일
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))
plot.ts(z,col='steelblue',
main = paste0(' iid N(0,1)'))
abline(h=0, col='grey', lty=2)
acf(z)
pacf(z)
graphics.off()
- 백색잡음이다.
::tsdisplay(z) forecast
::ggtsdisplay(z) forecast
확률보행과정
\(Z_t = Z_{t−1} + ϵ_t = ϵ_1 + ϵ_2 +⋯+ ϵ_t, ϵ ∼ WN(0, σ^2)\)
\(Z_1 = \epsilon_1\)
\(Z_2 = \epsilon_1 + \epsilon_2\)
각각의 오차들을 더해나가는거..
<- 1:4)
(a cumsum(a)
- 1
- 2
- 3
- 4
- 1
- 3
- 6
- 10
-
cumsum: 누적합
= rnorm(200, 0, 1)
z = cumsum(z)
rw plot.ts(rw,)
- 랜덤워크는 형태가 계속 변한다.ㅡ
= rnorm(200, 0, 1)
z = cumsum(z)
rw ::tsdisplay(rw,
forecastmain = "Random Walk Process")
- ACF가 빨리 감소하나 천천히 감소하냐를 확인하자.
-
확률적 추세: 추세가 있는 것 같기도 하고.. 바뀌는 것 같기도 하고.. ACF가 천천히 감소하면 확률적 추세가 있구나 라고 생각
\(Z_t = Z_{t-1} + \epsilon_t= \epsilon_1 + \epsilon_2 + \dots + \epsilon_t\): 현재 오차나 과거 오차가 다 영향을 주고 있다.
\(Z_t - Z_{t-1} = \epsilon_t\): 차분하면 WN이 된다.
-
결정적 추세: 눈에 보이는
-
차분 관련 함수
= diff(rw,1)
diff_rw
::tsdisplay(diff_rw) forecast
절편이 있는 확률보행 과정
\(Z_t = δ + Z_{t−1} + ϵ_t = tδ + ϵ_1 + ϵ_2 +⋯+ ϵ_t, ϵ ∼ WN(0, σ^2)\)
<- c()
rw_wd <- 0.3
delta 1] <- delta + rnorm(1)
rw_wd[for(k in 2:200){
<- delta + rw_wd[k-1] + rnorm(1)
rw_wd[k]
}plot.ts(rw_wd)
-
위와 똑같은 함수
<- 200
n <- (1:n)* delta + cumsum(rnorm(n))
rw_wd ::tsdisplay(rw_wd,
forecastmain = "Random Walk Process with Drift")
- 확률적 추세가 있다.
여러가지 데이터에 대한 ACF PACF
sin
<- 1:100
t <- sin(t*pi/3) #주기6
z plot.ts(z)
points(t,z, pch=16)
::tsdisplay(z) forecast
- 주기가 6인게 좀 튀어나와있음
<- 12
s <- sin(2*t*pi/s) + rnorm(100,0,0.4)
z ::tsdisplay(z) forecast
- 오차있고 주기가 12인거
<- 12
s <- 0.2*t + 2*sin(2*t*pi/s) + rnorm(100,0,1.2)
z ::tsdisplay(z) forecast
- 천천히 감소하다가 중간에 튀어나온게있음(계절성분때문에)
population
<- scan("population.txt")
z ::tsdisplay(z) forecast
- 선형 추세: ACF가 천천히 감소하고, PACF는 1차시만..
depart
<-scan("depart.txt")
z ::tsdisplay(z, lag.max=60) forecast
계절성분 있고, 추세는 거의 없다.
추세가 있다면 acf가 감소함
튀어나오는 부분-> 계절성분 때문에
ACF는 12,24,36,48,60 에서 튀어나오는데 갈수록 적게 튀어나옴.. -> 계절주기가 12이면 12,24,36이 비슷한 영향?? 이라 생각할 수 있어.
PACF는 12,36을 알면.. 오차만 남으니까 24만 튀어나옴. 24만 유의미해.
mindex
<- scan("mindex.txt")
z ::tsdisplay(z) forecast
- PACF에서 조금 튀어나오는 건.. 무시..
stock
<- scan("stock.txt")
z ::tsdisplay(z) forecast
- 추세가 있으니 ACF가 천천히 줄어들고, PACF가 첫번째만 살고 나머지는 다 0
koreapass
<- scan("koreapass.txt")
z ::tsdisplay(z) forecast
- 이분산성이 있으니 로그변환을 하자
<- log(z)
logz ::tsdisplay(logz) forecast
- 시도표는 변하지만 ACF랑 PACF는 변하지 않아. 로그변환한거랑은 상관없다
<- diff(log(z))
diff_log_z ::tsdisplay(diff_log_z) forecast